package cn.hxzy.controller;

import cn.hxzy.domain.User;
import cn.hxzy.domain.vo.StudentVo2;
import cn.hxzy.listenr.StudentListener;
import cn.hxzy.service.TeacherService;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author wangboyu
 * @Description TODO
 * @Date 2024/7/6 15:54
 */
@RestController
@CrossOrigin
public class ExcelController {

    @Autowired
    public TeacherService teacherService;
    @PostMapping(value = "/importData")
    public void importData(MultipartFile file) {
        try {
            //获取文件的输入流
            InputStream inputStream = file.getInputStream();
            List<User> list = EasyExcel.read(inputStream) //调用read方法
                    //注册自定义监听器，字段校验可以在监听器内实现
                    .registerReadListener(new StudentListener())
                    .head(User.class) //对应导入的实体类
                    .sheet(0) //导入数据的sheet页编号，0代表第一个sheet页，如果不填，则会导入所有sheet页的数据
                    .headRowNumber(1) //列表头行数，1代表列表头有1行，第2行开始为数据行
                    .doReadSync(); //开始读Excel，返回一个List<T>集合，继续后续入库操作

            System.out.println(list);
            // TODO 导入后的处理逻辑

        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }

    /**
     * 导出数据
     */
    @GetMapping("/exportData")
    public void exportUserExcel(HttpServletResponse response) throws IOException {
        OutputStream outputStream = response.getOutputStream();
        try {
            long l = System.currentTimeMillis(); //时间戳
            String filePath = "studentList_"+l+".xlsx"; // 保存到当前项目下的文件名
            File file = new File(filePath);
            this.setExcelResponseProp(response, "学生列表");
            List<StudentVo2> studentVo2s = teacherService.selectStudentByTeacher("2");


            // 创建本地文件输出流
            outputStream = new FileOutputStream(file);
            //这个实现方式非常简单直接，使用EasyExcel的write方法将查询到的数据进行处理，以流的形式写出即可
            EasyExcel.write(outputStream, StudentVo2.class)//对应的导出实体类
                    .excelType(ExcelTypeEnum.XLSX)//excel文件类型，包括CSV、XLS、XLSX
                    .sheet("Student列表")//导出sheet页名称
                    .doWrite(studentVo2s); //查询获取的数据集合List<T>，转成excel
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }

    /**
     * 设置响应结果
     *
     * @param response    响应结果对象
     * @param rawFileName 文件名
     * @throws UnsupportedEncodingException 不支持编码异常
     */
    private void setExcelResponseProp(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {

        //设置内容类型
        response.setContentType("application/vnd.vnd.ms-excel");
        //设置编码格式
        response.setCharacterEncoding("utf-8");
        //设置导出文件名称（避免乱码）
        String fileName = URLEncoder.encode(rawFileName.concat(".xlsx"), "UTF-8");
        // 设置响应头
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
    }
}
